{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2a7c2306",
   "metadata": {},
   "source": [
    "# 这里是经典的开山之作论文的精读笔记。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "035bf486",
   "metadata": {},
   "source": [
    "## 1.1 介绍几种类型的解读"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e31c8a50",
   "metadata": {},
   "source": [
    "<img src=\"./picture/1.png\" alt=\"Drawing\" style=\"width: 500px;\" align=\"left\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b96495bf",
   "metadata": {},
   "source": [
    "这里学习的GAN是一种对抗学习，自监督学习以及无监督学习，就是不需要人类去干预，自己训练出一个模型。\n",
    "\n",
    "如果要使用GAN网络的话，就可以去openmmlab的开源算法库中去学习（这个星期可以去看看这个开源库，同时去学习一下这个jittor的框架）\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25bd8c62",
   "metadata": {},
   "source": [
    "# 二.GAN网络"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e8646bf",
   "metadata": {},
   "source": [
    "## 2.1 GAN网络的基本构造。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d6223dc",
   "metadata": {},
   "source": [
    "<img src=\"./picture/2.png\" alt=\"Drawing\" style=\"width: 500px;\" align=\"left\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99d1636c",
   "metadata": {},
   "source": [
    "1.在GAN这个网络当中，有一个生成器$G$和一个判别器$D$。其中这两个网络都是使用简单的全连接层作为黑箱来进行输出的。\n",
    "\n",
    "2.其中$G$可以生成一些随机的噪声（可以很多维），然后判别器用于判别你给我的这个图片是来自Trainingset还是来自$G$\n",
    "\n",
    "3.$D$的任务就是用判别出这个图片是来自Traingset还是来自$G$,$G$的任务就是生成图片来骗过$D$,两个网络可以共同的进步。但是\n",
    "最终我是希望$G$最终可以获胜，这个样子就达到了生成图片的效果。\n",
    "\n",
    "4.在$D$中是一个二分类模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8bcba909",
   "metadata": {},
   "source": [
    "## 2.2 通俗的理解GAN网络"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1b1506f",
   "metadata": {},
   "source": [
    "1.警察与造假币的例子：\n",
    "\n",
    "造假币的($G$)要防止自己的造的假币被发现，警察（$D$）要想方设法的找出假币,两个人共同的“进步”。\n",
    "造假币的不断提升自己造假币的技术，警察要想方设法的找出假币，但是我最终希望造假币的赢\n",
    "\n",
    "2.枯叶蝶的例子：\n",
    "\n",
    "枯叶蝶为了自己不被鸟吃掉，就拟态出了枯叶的形象，但是枯叶蝶并不是真的变成了枯叶，而是说变成很像枯叶的东西\n",
    "上面的造假币也是，不是为了早出真币而是造出假币来拟合真币。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56722523",
   "metadata": {},
   "source": [
    "# 三.GAN中的数学符号说明以及损失函数介绍"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b5ed1cf",
   "metadata": {},
   "source": [
    "## 3.1 GAN中各种的符号说明。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5fad08a0",
   "metadata": {},
   "source": [
    "<img src=\"./picture/3.png\" alt=\"Drawing\" style=\"width: 500px;\" align=\"left\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37a7c2f9",
   "metadata": {},
   "source": [
    "在GAN中可以看到十分多的数学符号，这里要一一进行解读：\n",
    "\n",
    "1.首先$G\\left( z;\\theta _g \\right)$表示的是生成器$G$输入的是一个噪声$z$,然后后面的$\\theta_g$表示的是$G$中多层感知机的参数\n",
    "$D\\left(x;\\theta_d\\right)$表示的是$D$输入的$x$(其中$x$可以是trainingset中的数据也可以是$G$生成的数据)\n",
    "\n",
    "\n",
    "2.接下来讲解一个下面的那个公式，这个公式是十分重要的，这里要详细的讲解一下：\n",
    "\n",
    "（1）首先是$\\underset{G}{\\min}$,这里表示的是固定$D$,然后最小化$V$（因为我要愚弄这个$D$），\n",
    "然后$\\underset{D}{\\max}$表示固定$G$最大化$V$（因为判别器也要不断的优化，判别器的任务就是分类出是来自Trainingset还是$G$）\n",
    "\n",
    "（2）然后$E_{x\\backsim p_{data}\\left( x \\right)}$表示的是$x$这个数据是符合Trainingset中图片的正态分布的，同样的类比可以知道\n",
    "$E_{z\\backsim p_z\\left( z \\right)}$表示的是$z$是一个噪声，这个噪声符合$G$的那个分布。\n",
    "这里表示的是绿框的期望加上蓝色框的期望，也就是说整个式子是期望相加。只要你是真实图像，那就到第一个，\n",
    "是$G$生成的图像，那就到第二个去。\n",
    "\n",
    "（3）接下来就是里面的对数，这里面的对数讲述了为什么要最大化$D$,和最小化$G$.\n",
    "首先$x$是符合Trainingset的数据的，那么第一条式子我希望我的辨别器$D$可以输出1，这个时候$logD(x)$的\n",
    "输出就是0，因为$D$是一个二分类器，所以输出的范围是在0~1之间，所以只要这个$D$不是很好，那么就会变成负数\n",
    "所以要最大化$D$.关于最小化$G$,因为$G(z)$表示的是生成器$G$生成的图片，所以$D(G(z))$应该等于0，这个时候$log$会\n",
    "等于0，但是第二个函数只要输出不是0那么整体的输出就会小于于0，所以要最小化$G$。\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39b550ea",
   "metadata": {},
   "source": [
    "## 3.2GAN的训练过程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b92b29bd",
   "metadata": {},
   "source": [
    "<img src=\"./picture/4.png\" alt=\"Drawing\" style=\"width: 500px;\" align=\"left\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5912193",
   "metadata": {},
   "source": [
    "这里是非常经典的4个图片，只要搞明白了这四张图片，就明白了整个的GAN网络。\n",
    "\n",
    "1.下面的横线和竖线表示的是噪声$z$经过函数映射形成了$x$（说人话就是由生成器去生成一个图片）\n",
    "\n",
    "2.上面有3个线（绿色的，蓝色的和黑色的），绿色的代表的是$G$生成的图片分布，黑色的代表的是真实图线（也就是Trainingset中的图像），蓝色的代表的是判别器$D$.\n",
    "\n",
    "3.这里要着重分析一下判别器，因为判别器在识别真实图像的时候要尽可能的接近1，然后$G$生成的图像尽量的接近0，可以在第一个图像中看到，这个判别器其实拟合的不是很好。\n",
    "\n",
    "4.在知道蓝色的线是判别器而且可以看到判别器并不是很好（其实在训练初期的时候判别器都还没开始训练好，效果肯定不是很好），首先要做的事情就是训练判别器，训练完判别\n",
    "器之后的图线就是第二个图，可以看到，在真实图线分布比较密集的情况下判别器的输出值比较高，在$G$生成的图像，这个时候给予比较低的评分，可以看到，这个时候的判别器训练的\n",
    "效果就非常好。\n",
    "\n",
    "5.这个时候判别器已经训练的十分好了，这个时候就让$G$也就是生成器去拟合原始的数据（这个时候就是一个反向传播的过程不断的训练出想要的参数）\n",
    "然后再一次的训练判别器$D$,可以看到第三张图片，这个时候判别器再一次的训练去尝试分开两个分布。\n",
    "\n",
    "6.不断重复上述的过程，知道最终的真实图像分布与$G$的分布重合，这个时候判别器就分辨不出来，就可以生成出和真实图像一样的数据了。\n",
    "\n",
    "7.此时$D(x) = 1/2$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04f3c869",
   "metadata": {},
   "source": [
    "## 3.3 公式推导上述过程。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35713bb1",
   "metadata": {},
   "source": [
    "<img src=\"./picture/6.png\" alt=\"Drawing\" style=\"width: 500px;\" align=\"left\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bda5e1f1",
   "metadata": {},
   "source": [
    "这里讲述了两个公式：\n",
    "\n",
    "1.第一个其实就是上面第一个求期望的式子，这里求解平均值其实就是期望。\n",
    "\n",
    "2.首先进行$k$次迭代用于训练判别器$D$,这里将生成器$G$固定住，然后求解上面图片第一个式子的梯度。\n",
    "这里要特别说明一下啊，因为真实图像是我们送进去的，所以绿色的可以不用管（随着判别器的不断优化，会达到想要的结果），关键是后面的那一项，\n",
    "判别器要识别出$G$生成的图像，让他变成0，也就是最大化.(因为只要有一点的偏差就会是负数，最大值就是0)\n",
    "\n",
    "3.在训练生成器的时候，这个时候是和判别器没有关系的，所以只用看最后一项即可。\n",
    "这个时候就要最小化了，因为生成器的目的就是为了迷惑判别器，所以最终的目的就是最小化函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66007e01",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "208d8926",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
